package com.guoxue.dao.impl;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.guoxue.dao.IFollowsDao;
import com.guoxue.domain.FollowsVo;
import com.guoxue.util.codeSwitch.zt;

@Repository
public class FollowsDaoImpl extends BaseDaoImpl<FollowsVo> implements IFollowsDao {

	// D__:followe"D"字段为被关注者。若等于uid,表示关注uid的人,即uid的关注者列表;
	// R__:followe"R"字段为关注者。若等于uid,表示uid所关注的人,即uid的好友列表(若sysflag为3,表示黑名单列表);

	// sysflag:0:正常状态。3:黑名单状态。1:陌生人状态(当从其它状态切换到陌生人状态时设置为1,效果等同于该记录不存在。仅为了提高效率所以不删除该记录?)

	///////////////////////////////////////////////////////////////////////////////
	// --->获取列表:
	///////////////////////////////////////////////////////////////////////////////
	@Override
	/** D__:被关注者为uid,即uid的关注者列表 */
	public List<FollowsVo> getFriendsList(int uId) {
		zt.ts.function(); // 更名为getFollowersList(同时更名service中调用此方法的方法名称)
		zt.ts.function(); // 增加分页参数(startIndex,endIndex)
		return find("FROM FollowsVo f WHERE f.followed=? AND  f.sysflag=0", new Object[] { uId });
	}

	@Override
	/** R__:关注者为uid,即uid的好友列表 */
	public List<FollowsVo> getFollowedList(int uid) {
		zt.ts.function(); // 更名为getFriendsList(同时更名service中调用此方法的方法名称)
		zt.ts.function(); // 增加分页参数(startIndex,endIndex)
		return find("FROM FollowsVo f WHERE f.follower=? AND  f.sysflag=0", new Object[] { uid });
	}

	@Override
	/** R__:关注者为uid,但sysflag为3,即uid的黑名单列表 */
	public List<FollowsVo> getBlackList(int uid) {
		zt.ts.function(); // 增加分页参数(startIndex,endIndex)(问题:黑名单应该不会太长,不需要分页处理?)
		return find("FROM FollowsVo f WHERE f.follower=? AND  f.sysflag=3", new Object[] { uid });
	}

	///////////////////////////////////////////////////////////////////////////////
	// --->统计总数:
	///////////////////////////////////////////////////////////////////////////////
	@Override
	/** D__:被关注者为uid,统计uid的关注者的数量 */
	public int getFollowsCount(Integer uid) {
		zt.ts.function(); // 更名为getFollowersCount(同时更名service中调用此方法的方法名称)
		return count("SELECT COUNT(f.id) FROM FollowsVo f WHERE f.followed=? AND f.sysflag=0", new Object[] { uid })
				.intValue();
	}

	@Override
	/** R__:关注者为uid,统计uid的好友的数量 */
	public int getMyFollowsCount(Integer uid) {
		zt.ts.function(); // 更名为getFriendsCount(同时更名service中调用此方法的方法名称)
		return count("SELECT COUNT(f.id) FROM FollowsVo f WHERE f.follower=? AND f.sysflag=0", new Object[] { uid })
				.intValue();
	}

	@Override
	/** R__:关注者为uid,且sysflag为3,统计uid的黑名单成员的数量 */
	public int getBlackCount(Integer uid) {
		return count("SELECT COUNT(f.id) FROM FollowsVo f WHERE f.follower=? AND f.sysflag=3", new Object[] { uid })
				.intValue();
	}

	///////////////////////////////////////////////////////////////////////////////
	// --->查找指定的关注关系(FollowsVo)对象:
	///////////////////////////////////////////////////////////////////////////////
	@Override
	/**
	 * 查找指定的关注关系(FollowsVo)对象(通用,且不限sysflag状态)
	 * 
	 * @param followed
	 *            被关注者uid
	 * @param follower
	 *            关注者uid
	 */
	public FollowsVo getFriendByIdAllStatus(int followed, int follower) {
		zt.ts.function(); // 重命名为getFollowsVo_forAllStatus
		return get("FROM FollowsVo f WHERE f.follower=? AND f.followed=?", new Object[] { follower, followed });
	}

	@Override
	/**
	 * 查找指定的关注关系(FollowsVo)对象(通用,且要求符合指定的sysflag状态)
	 * 
	 * @param followed
	 *            被关注者uid
	 * @param follower
	 *            关注者uid
	 * @param sysflag
	 *            0:正常状态。3:黑名单状态。
	 *            1:陌生人状态(当从其它状态切换到陌生人状态时设置为1,效果等同于该记录不存在。仅为了提高效率所以不删除该记录?)
	 */
	public FollowsVo getFriendById(int followed, int follower, int sysflag) {
		zt.ts.function(); // 重命名为getFollowsVo_forDesignatedStatus
		return get("FROM FollowsVo f WHERE f.follower=? AND f.followed=? AND f.sysflag=?",
				new Object[] { follower, followed, sysflag });
	}

	@Override
	/**
	 * 查找指定的黑名单关系对象(限制sysflag为3)
	 * 
	 * @param uid
	 *            R__:关注者为uid
	 * @param blacker
	 *            被关注者(黑名单成员)的id
	 */
	public FollowsVo getBlackerById(int uid, int blacker) {
		return get("FROM FollowsVo f WHERE f.follower=? AND f.followed=? AND f.sysflag=3",
				new Object[] { uid, blacker });
	}

	///////////////////////////////////////////////////////////////////////////////
	// --->
	///////////////////////////////////////////////////////////////////////////////

	@Override
	public void saveFollows(FollowsVo vo) {
		saveOrUpdate(vo);
	}

	// @Override
	// public FollowsVo getBeBlackList(int uid, int blacker) {
	// return get("FROM FollowsVo f WHERE f.follower=? AND f.followed=? AND
	// f.sysflag>=1",
	// new Object[] { uid, blacker });
	// }
	//
	// @Override
	// public FollowsVo getFollowInfo(int uid, int blacker) {
	// return get("FROM FollowsVo f WHERE f.follower=? AND f.followed=? AND
	// f.sysflag<3",
	// new Object[] { uid, blacker });
	// }

}

///////////////////////////////////////////////////////////////////////////////
// --->
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
